<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
		<title>reduce</title>
	</head>
	<body>
		reduce语法:
		array.reduce(function(prev,cur,index,arr){
		//some code
		},init)
		-- prev 必需。首次执行时：如果有init，则首次返回init，如果没有init，则首次返回arr的第一项，后续返回上一次调用回调时返回值;
		-- cur 必需。当前正在处理的数组元素，且跟随索引index;
		-- index 可选。当前正在处理的数组元素索引,若提供init值,初始索引为0,否则为1;
		-- init 可选。表示初始值(可省略)
		-- arr 可选。 原数组

		reduceRight：reduce()方法从数组第一项开始遍历到最后一项。而 reduceRight()从最后一项开始遍历至第一项。除此之外，这两个方法没什么区别

	</body>
	<script type="text/javascript">
		var arr = [11, 22, 33, 44, 22,[55,66,[77]]];
       
		// 1.求和
		var arrSum = [11, 22, 33, 44, 22];
		var sum = arrSum.reduce((prev, cur, index) => {
			console.log("prev:", prev)
			console.log("cur:", cur)
			console.log("_________:", index)
			return prev + cur
		});
		console.log(sum);

		// 2.计算数组中每个元素出现的次数
		var obj = arr.reduce((prev, cur) => {
			if (cur in prev) {
				prev[cur]++
			} else {
				prev[cur] = 1
			}
			return prev
		}, {})
		console.log(obj)

		// 3.数组偏平化  Array.flat(Infinity)
		const newArr = (arr) => {
			return arr.reduce((prev, cur) => {
				return prev.concat(Array.isArray(cur) ? newArr(cur) : cur)
			}, [])
		}
		console.log(newArr(arr))

		//4.数组去重
		var resArr = arr.reduce((prev, cur) => {
			if (!prev.includes(cur)) {
				return prev.concat(cur)
			} 
			return prev
		}, [])
		console.log("数组去重:", resArr)


		console.log(Math.max.bind(null, ...arr)())

		// 类数组转换数组：Array.prototype.slice.call(类数组)
		var arrayLike = {
			'0': 'a',
			'1': 'b',
			'2': 'c',
			length: 3
		};
		console.log("slice.call:", Array.prototype.slice.call(arrayLike))
		console.log("es6方法，Array.from:", Array.from(arrayLike))
	</script>

</html>
